'use strict'

module.exports = function fmtMessage(msg, withEnd=true) {
  let text = ''

  if (Array.isArray(msg)) {
    let textarr = []
    
    for (let m of msg) {
      text = fmtMessage(m, false)
      text && textarr.push(text)
    }
    if (textarr.length === 0) return ''

    return textarr.join('\n\n') + '\n\n'
  }

  if (msg === null || msg === undefined || msg === '') {
    return ''
  }

  let typ = typeof msg

  if (typ === 'number') {
    msg = `${msg}`
    typ = 'string'
  }

  if (typ === 'object') {
    if (!(msg.event || msg.data || msg.retry || msg.id)) return ''
    
    if (msg.data === undefined) msg.data = ''

    let datatype = typeof msg.data

    switch (datatype) {
      case 'number':
        msg.data = msg.data.toString()
        break
      case 'object':
        msg.data = JSON.stringify(msg.data).replaceAll('\n', '%0A')
        break
      case 'function':
        msg.data = msg.data.toString().replaceAll('\n', '%0A')
        break
      case 'string':
        msg.data = msg.data.replaceAll('\n', '%0A')
        break

      default:
        msg.data = `${msg.data}`
    }

    text = `event: ${msg.event || 'message'}\ndata: ${msg.data}\n`
    if (msg.id) {
      text += `id: ${msg.id}\n`
    }

    if (msg.retry) {
      text += `retry: ${msg.retry}\n`
    }
  } else if (typ === 'string') {
    if (msg[0] !== ':') {
      text = `data: ${msg.replaceAll('\n', '%0A')}\n`
    } else {
      text = msg.replaceAll('\n', '%0A') + '\n'
    }
  } else if (typ === 'function') {
    text = `event: function\ndata: ${msg.toString().replaceAll('\n', '%0A')}\n`
  }

  if (withEnd) {
    text += `\n\n`
  }

  return text
}
